#include "Link_list.h"

//单链表的创建

Link_list *init_link_list(void)
{
    //创建头节点的动态空间
    Link_list *list = (Link_list *)malloc(sizeof(Link_list));
    if(NULL == list)
    {
        printf("创建失败\n");
        return NULL;
    }
    list->next = NULL;
    return list;
}

//单链表的销毁
void free_Link_list(Link_list **list)
{
    if(NULL == *list)
    {
        printf("链表为空\n");
        return ;
    }
    //销毁节点
    Node *ptr_1 = (*list)->next;
    Node *ptr_2 = ptr_1->next;
    while(ptr_1 !=NULL)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if(NULL != ptr_2)
        {
            ptr_2 = ptr_2->next;
        }
    }
    //销毁头节点
    free(*list);
    *list = NULL;
}

//插入
void insert_node(Link_list *list , Element_data data , int index)
{
    //安全判断
    if(NULL == list)
    {
        printf("表为NULL\n");
        return;
    }

    //创建新节点
    Node * new_node = (Node *)malloc(sizeof(Node));
    if(NULL == new_node)
    {
        printf("new_node 创建动态内存失败\n");
        return ;
    }

    //写入数据
    new_node->next = NULL;
    new_node->data = data;

    //头插
    if(1 == index)
    {
        //新节点的next指向头节点的next
        new_node->next = list->next;

        //头节点next 指向 新节点
        list->next = new_node;
        return ;
    }

    //任意插入
    Node *ptr = list->next;

    for (size_t i = 1; i < index -1 && ptr != NULL; i++)
    {
        ptr = ptr->next;
    }

    if (NULL == ptr)
    {
        printf("ptr 指向空\n");
        free(new_node);
        return;
    }
    
    //新节点的next指向ptr的next
    new_node->next = ptr->next;

    //ptr的 next 指向新节点
    ptr->next = new_node;

    return ;
}

//遍历打印
void printf_link_list(Link_list *list)
{
    if(NULL == list->next)
    {
        printf("表内数据为空\n");
    }
    Node *ptr = list->next;
    while(ptr != NULL)
    {   
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
        ptr->data.name,ptr->data.sex,ptr->data.age,ptr->data.sco,ptr->data.id);
        ptr = ptr->next;
    }
}

//删除 
void delete_node(Link_list *list ,int index)
{
    if(NULL == list)
    {
        printf("表为NULL\n");
        return;
    }
    if(NULL == list->next)
    {
        printf("表内无数据\n");
        return ;
    }

    //指向头节点的下一个节点
    Node *ptr_1 = list->next;
    Node *ptr_2 = NULL;

    //删除头节点
    if (1 == index)
    {
        //list的第二个节点覆盖第一个节点
        list->next = ptr_1->next;
        free(ptr_1);
        return ;
    }

    //遍历循环,找到要删除节点的前一个节点ptr_1
    for (size_t i = 1; i < index - 1 && NULL != ptr_1; i++)
    {
        ptr_1 = ptr_1->next;
    }
    
    if(NULL == ptr_1)
    {
        printf("ptr_1指向NULL\n");
        return ;
    }

    //指向要删除的节点ptr_2
    ptr_2 = ptr_1->next;

    //ptr_1的next跳过ptr_2直接指向ptr_2的next连接ptr_2的下一个节点
    ptr_1->next = ptr_2->next;
    
    //释放ptr_2
    free(ptr_2);

    return ;
}

//单链表的位置查找
Node *find_node_id(Link_list *list,int index)
{
    if(list == NULL)
    {
        printf("表为NULL\n");
        return NULL;
    }
    if(NULL == list->next)
    {
        printf("表内无数据\n");
        return NULL;
    }

    //指向头节点的下一个节点
    Node *ptr = list->next;

    for (size_t i = 1; i < index; i++)
    {
        ptr = ptr->next;
    }
    
    return ptr;
}

//单链表的名字查找
Node *find_node_name(Link_list *list,char *name)
{
    if(NULL == list)
    {
        printf("表为空\n");
        return NULL;
    }
    if(NULL == list->next)
    {
        printf("表内无数据\n");
        return NULL;
    }

    Node *ptr = list->next;
    
    while (ptr!=NULL)
    {
        if( 0 == strcmp(ptr->data.name,name))
        {
            return ptr;
        }
        //向后遍历
        ptr = ptr->next;
    }
    return NULL;
}

//单链表的清空
void clear_link_list(Link_list *list)
{
    if(NULL == list)
    {
        printf("表为空\n");
        return ;
    }
    if(NULL == list->next)
    {
        printf("表内无数据\n");
        return ;
    }

    //销毁节点
    Node *ptr_1 = list->next;
    Node *ptr_2 = ptr_1->next;

    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);

        ptr_1 = ptr_2;        
        if(NULL != ptr_2)
        {
            ptr_2 = ptr_2->next;
        }
    }
    
    //让list->next 指向空
    list->next = NULL;

}

//单链表的合并
Link_list *merge_link_lists(Link_list *list1 , Link_list *list2)
{   
    if(NULL == list1 || NULL == list2 )
    {
        printf("表为空\n");
        return NULL;
    }

    if(NULL == list1->next && NULL == list2->next)
    {
        printf("两个表内无数据\n");
        return NULL;
    }

    Link_list *list3 = init_link_list();

    Node *ptr_1 = list1->next;
    
    size_t i =0;
    while(ptr_1 != NULL)
    {
        insert_node(list3 ,ptr_1->data,i);
        ptr_1 = ptr_1->next;
        i++;
    }
    
    ptr_1 = list2->next;  
    while(ptr_1 != NULL)
    {
        insert_node(list3,ptr_1->data,i);
        ptr_1 = ptr_1->next;
        i++;
    }
    return list3;
}
